//基本string计算
//本文件由：姚凯文（学号）贺镇涛（2021300004071）负责
#include"StringOper.h"
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include <sstream>
using namespace std;

int x[5000];//记得每个函数里用完都要memset(x,0,sizeof(x));清零
char ans[5000];
int l,l1,c[10005],p;

string StringPlus(const std::string& a, const std::string& b)
{
    int i;
    size_t sa = a.size();
    size_t sb = b.size();
    size_t m = max(sa, sb);
    if (sa > sb)
    {
        for (i = 1; i <= sa; ++i)//遍历
        {
            x[i] = a[sa - i] - 48;
        }
        for (i = 1; i <= sb; ++i)
        {
            x[i] += b[sb - i] - 48;
        }
    }
    else
    {
        for (i = 1; i <= sb; ++i)
        {
            x[i] = b[sb - i] - 48;
        }
        for (i = 1; i <= sa; ++i)
        {
            x[i] += a[sa - i] - 48;
        }
    }
    for (i = 1; i <= m; ++i)
    {
        if (x[i] >= 10)
        {
            x[i] -= 10;
            ++x[i + 1];
        }
    }
    if (x[m + 1] > 0)
    {
        ++m;
    }
    for (i = m; i >= 1; --i)
    {
        ans[m - i] = x[i] + '0';
    }
    string* result = new string(ans);
    cout << *result << endl;
    memset(x, 0, sizeof(x));
    memset(ans, 0, sizeof(ans));
    return *result;
}

string StringMinus( string& a, string& b)
{
    a='0'+a;
    b='0'+b;//将第0位占0
    if(a.size()<b.size()||(a.size()==b.size()&&a<b))//假如a<b
    {
        cout<<'-';//结果为负数，先输出减号
        swap(a,b);//交换两个数（例如3-5可以变为0-（5-3）），这样子方便后面计算
    }
    l=a.size();
    l1=b.size();
    while(l1<l)//因为已经确保这时b<a了，所以直接在b前面添0
    {
        b='0'+b;
        l1++;
    }//利用c++的特性让个位对齐
    for(int i=1;i<l;i++)c[i]=a[i]-b[i];//计算差
    while(1)//用来退位，因为可能要多次退位，所以用while循环
    {
    p=1;//开关，用来看是否需要退位
    for(int i=1;i<l;i++)
    {
        if(c[i]<0)//需要退位
        {
            c[i-1]--;//向前一位退位
            c[i]=10+c[i];
            p=0;//开关置零，需要重新复查
        }
    }
    if(p)break;//不需要退位了，就退出
    }
    p=1;
    int j=0;
    for(int i=1;i<l;i++)
    {
    if(c[i]!=0)p=0;
    if(p==0)cout<<c[i];//特判前导0
        ans[j]=c[i];
        j++;
    }
    if(p==1)cout<<0;//特判，可能结果本身就为0
    string ans1 = ans;
    
    return ans1;
}

string StringMulty(const string& a, const string& b)
{
    string temp;
    double tmp;
    tmp = stod(a) * stod(b);
    return to_string(tmp);
}
string StringDiv(const string& a, const string& b)
{
    string temp;
    double tmp;
    tmp = stod(a) / stod(b);
    return to_string(tmp);
}
std::string StringPow(const std::string& a, const std::string& b)
{
    return to_string(pow(stod(a), stod(b)));
}
void RemoveZero(std::string* out)//贺镇涛
{
    /*去除小数点后多余的零*/
    if ((*out).find('.') != string::npos)
    {
        int size = int(strlen((*out).c_str()));
        for (int i = size - 1; i > 0; --i)
        {
            if ((*out)[i] == '0')	(*out)[i] = '\0';
            else if ((*out)[i] == '.')
            {
                (*out)[i] = '\0';
                break;
            }
            else break;
        }
    }
}
